package com.aviator.executor;

import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.AviatorEvaluatorInstance;
import com.googlecode.aviator.Options;

import java.math.BigDecimal;

/**
 * @Author: Jiangxx
 * @Date: 2021/12/30
 * @Description: 描述执行表达式、多行表达式、求值器多实例
 */
public class AviatorExecutor01 {

    public static void main(String[] args) {
        /* 表达式 */
        String expression = "1+2+3";
        String bigDecimal = "1.0+2.0+3";

        /* 多行表达式 */
        String expressions = "print('hello world'); 1+2+3 ; 100-1";

        /* Aviator的数值类型只支持Long和Double，任何正数都将转换成Long,任何浮点数都将转换为Double */
        Long result = (Long) AviatorEvaluator.execute(expression);

        /* 如果开启了 ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL 选项，那么在表达式中出现的浮点数都将解析为 BigDecimal */
        AviatorEvaluator.setOption(Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL, true);
        BigDecimal bigDecimalResult = (BigDecimal) AviatorEvaluator.execute(bigDecimal);

        /* 从 4.0.0 开始， aviator支持以分号 ; 隔开的多行表达式，对于多行表达式求值的结果将是最后一个表达式的结果 */
        /* 结果将是最后一个表达式 100-1,也就是 99，但是中间的表达式也将执行，包括打印 hello world。
        通过在表达式求值过程中加入 println打印，可以方便调试，也可以通过 Options.TRACE_EVAL来跟踪执行过程 */
        AviatorEvaluator.setOption(Options.TRACE_EVAL, true);
        Long expression1 = (Long) AviatorEvaluator.execute(expressions);

        /* 求值器多实例 */
        AviatorEvaluatorInstance aviatorEvaluatorInstance = AviatorEvaluator.newInstance();
        Object execute = aviatorEvaluatorInstance.execute(expression);


        /* 输出结果 */
        System.out.println(result); //6
        System.out.println(bigDecimalResult);//6.0
        System.out.println(expression1);

    }
}
